﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;
using System.Data.Objects;

namespace SCEM.DTO
{
    [DataContract]
    public class EquipamentoDTO : IDTO<Equipamento>
    {
        public Equipamento ConvertToEntity(ObjectContext context)
        {
            Equipamento equipamento = new Equipamento();
            SCEMContainer scemContext = (SCEMContainer)context;
            Guid guid;
            Guid fornecedorGuid;

            // Verifica se o DTO representa uma entidade já persistida no banco
            if (!String.IsNullOrEmpty(Id) && Guid.TryParse(Id, out guid))
            {
                var queryEquipamento = from e in scemContext.Equipamentos
                                       where e.Id == guid
                                       select e;

                if (queryEquipamento.Count() == 1)
                    equipamento = queryEquipamento.First();
            }

            // Tratar corretamente o caso de o DTO ser uma nova entidade a ser persistida no banco
            if (equipamento.Id == Guid.Empty || equipamento.DataCadastro == DateTime.MinValue)
            {
                equipamento.Id = Guid.NewGuid();
                equipamento.DataCadastro = DateTime.Now;
                equipamento.InformacoesManutencao = new InformacoesManutencao();
                equipamento.InformacoesManutencao.DataUltimaManutencaoPreventiva = DataCompra;
            }

            // Conversão de DTO para entidade
            equipamento.DataAtualizacao = DateTime.Now;
            equipamento.Codigo = Codigo;
            equipamento.Nome = Nome;
            equipamento.Descricao = Descricao;
            equipamento.Fabricante = Fabricante;
            equipamento.Preco = Preco;
            equipamento.DataCompra = DataCompra;
            equipamento.PeriodoGarantiaDias = PeriodoGarantiaDias;
            equipamento.InformacoesManutencao.PeriodoManutencaoPreventivaDias = PeriodoManutencaoPreventivaDias;
            equipamento.Ativo = Ativo;
            if (!String.IsNullOrEmpty(FornecedorId)
                    && Guid.TryParse(FornecedorId, out fornecedorGuid))
                equipamento.FornecedorId = fornecedorGuid;

            // Trata o relacionamento com o tipo de fisioterapia
            if (!(equipamento.TiposFisioterapia != null && equipamento.TiposFisioterapia.Id != null && equipamento.TiposFisioterapia.Id.ToString() == TipoFisioterapiaId)
                && Guid.TryParse(TipoFisioterapiaId, out guid))
            {
                var queryTipoFisioterapia = from tf in scemContext.TiposFisioterapia
                                            where tf.Id == guid
                                            select tf;
                if (queryTipoFisioterapia.Count() == 1)
                    equipamento.TiposFisioterapia = queryTipoFisioterapia.First();
            }
            return equipamento;
        }
                
        [DataMember]
        public string Id { get; set; }
        [DataMember]
        public string Codigo { get; set; }
        [DataMember]
        public string Nome { get; set; }
        [DataMember]
        public string Descricao { get; set; }
        [DataMember]
        public string Fabricante { get; set; }
        [DataMember]
        public decimal Preco { get; set; }
        [DataMember]
        public DateTime DataCadastro { get; set; }
        [DataMember]
        public DateTime DataAtualizacao { get; set; }
        [DataMember]
        public DateTime DataCompra { get; set; }
        [DataMember]
        public int PeriodoGarantiaDias { get; set; }
        [DataMember]
        public int PeriodoManutencaoPreventivaDias { get; set; }
        [DataMember]
        public string FornecedorId { get; set; }
        [DataMember]
        public string TipoFisioterapiaId { get; set; }
        [DataMember]
        public bool Ativo { get; set; }

    }
}
